/**
 * 数组中两个字符串的最小距离
 *
 * 给定一个字符串数组strs，再给定两个字符串str1和str2，
 * 返回在strs中str1和str2的最小距离，如果str1或str2为null，或不在strs中，返回-1。
 *
 * 输入描述:
 * 输入包含有多行，第一输入一个整数n
 * （1≤n≤10^5），代表数组strs的长度，第二行有两个字符串分别代表str1和str2，
 * 接下来n行，每行一个字符串，代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。
 *
 * 输出描述:
 * 输出一行，包含一个整数，代表返回的值。
 */

import java.util.Scanner;

/**
 * 这题主要是通过模拟来
 * 我们可以使用暴力解法一个列举一个找来解决这个问题, 但是很明显的
 * 时间复杂度是不允许的, 所以我们模拟来优化他, 我们会发现, 每当我们
 * 找到一个符合的字符串的时候, 后面当没有找到另一个的时候, 再次找到
 * 就需要更新这个的下标, 当先找到另一个字符串的时候, 我们就需要先求得
 * 一次最短路, 后面找到相同的直接原地更新记录的下标就可以了, 只要找
 * 到一次就可以了
 * 时间复杂度 : O(n)
 * 空间复杂度 : O(1)
 */

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String str1 = in.next(), str2 = in.next();
        String[] strs = new String[n];
        in.nextLine();
        for (int i = 0; i < n; i++) {
            strs[i] = in.nextLine();
        }

        // 初始化, 防止找不到
        int res = n;

        // 标记下标
        int a = -1, b = -1;

        for (int i = 0; i < n; i++) {

            // 第一个位置更新 a
            if (strs[i].equals(str1)) {
                a = i;
                if (b != -1) {
                    res = Math.min(res, a - b);
                }
            }

            // 第二个位置更新 b
            if (strs[i].equals(str2)) {
                b = i;
                if (a != -1) {
                    res = Math.min(res, b - a);
                }
            }
        }

        // 最后要是没有找到的话返回 -1
        if (res == n) {
            res = -1;
        }

        System.out.println(res);
    }
}